curl --request POST \
--url https://api.range.org/v2/screening/checks/{check_id}/executed \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"tx_hash": "0x9a3f5c…"
}
'import requests
url = "https://api.range.org/v2/screening/checks/{check_id}/executed"
payload = { "tx_hash": "0x9a3f5c…" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({tx_hash: '0x9a3f5c…'})
};
fetch('https://api.range.org/v2/screening/checks/{check_id}/executed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.range.org/v2/screening/checks/{check_id}/executed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tx_hash' => '0x9a3f5c…'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v2/screening/checks/{check_id}/executed"
payload := strings.NewReader("{\n \"tx_hash\": \"0x9a3f5c…\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.range.org/v2/screening/checks/{check_id}/executed")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tx_hash\": \"0x9a3f5c…\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/screening/checks/{check_id}/executed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tx_hash\": \"0x9a3f5c…\"\n}"
response = http.request(request)
puts response.read_body{
"check_id": "6f1c2a9e-3b7d-4c55-9a0e-2d8f1e4b7c31",
"direction": "outbound",
"client_entity_id": "6859927c-292e-4077-8d6a-70542c00a267",
"client_name": "Northwind Custody",
"counterparty_address": "0x62348b9125085ee5286aa68a7a17d15f090192bd",
"counterparty_name": null,
"network": "eth",
"amount": "48000.00",
"asset": "USDC",
"transfer_ref": "pay_8812",
"transaction_id": null,
"tx_hash": null,
"is_approved_counterparty": false,
"flagged": true,
"reasons": [
{
"code": "not_approved_counterparty",
"check_type": "approved_counterparties",
"policy_key": "client.whitelist",
"message": "Not one of the client's approved counterparties"
}
],
"checks": [
{
"kind": "address_risk",
"check_type": "range_address_risk",
"label": "Range address risk",
"provider": "range",
"provider_used": null,
"status": "pass",
"screened_at": "2026-10-07T09:12:03.120Z",
"note": null,
"reason": {
"code": "not_approved_counterparty",
"check_type": "approved_counterparties",
"policy_key": "client.whitelist",
"message": "Not one of the client's approved counterparties"
},
"risk_tier": "low",
"travel_rule_status": "complete",
"provider_detail": {
"provider_status": "SETTLED"
},
"evidence": {
"screen_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"score": 100,
"sanctioned": true,
"signals": [
{
"signal": "eu-sanctioned",
"name": "EU Sanctioned",
"pillar": "exposure",
"severity": "severe",
"summary": "1.24% of counterparty volume is eu-sanctioned, crossing the 1% (severe) threshold.",
"confidence": null,
"rule": {
"name": "Sanctions exposure",
"threshold": "1% (severe)"
}
}
],
"listings": [
{
"authority": "OFAC",
"program": "SDN",
"list_key": "us_ofac_sdn",
"listed_at": "2022-04-14",
"delisted_at": null
}
],
"attribution": [
{
"name": "Lazarus Group",
"category": "sanctions",
"role": "owner",
"polarity": "risk",
"confidence": 98
}
],
"exposures": [
{
"name": "Tornado Cash",
"category": "mixer",
"direction": "incoming",
"hop": "direct",
"share": 0.123,
"share_basis": "total-volume",
"usd": 45210
}
],
"totals": {
"incoming_usd": 367000,
"outgoing_usd": 120000,
"flagged_incoming_usd": 45210,
"flagged_outgoing_usd": 0
},
"data_as_of": "2026-10-08T09:00:00Z",
"provider_used": "chainalysis"
}
}
],
"case_id": "0d9c7a1e-5b3f-4a2e-8c6d-1f2e3a4b5c6d",
"travel_rule_followup": {
"status": "awaiting",
"executed_at": null,
"tx_hash": null,
"due_at": null,
"resolved_at": null,
"provider": "notabene",
"case_id": null,
"travel_rule_status": "complete"
},
"created_at": "2026-10-07T09:12:03.120Z",
"verdict": "blocked",
"status": "pending",
"executed_at": null,
"cancelled_at": null,
"execution_case_id": null
}[Beta] report that an outbound payment was sent
Always call it after broadcasting. Safe to resend with the same tx_hash. Starts the travel rule follow-up when the setup checks the travel rule (a missing or incomplete record opens a case later; the verdict never changes). A blocked payment reported as sent is recorded and opens an executed_despite_block case. 409 execution_conflict only for a different tx_hash or a cancelled check.
curl --request POST \
--url https://api.range.org/v2/screening/checks/{check_id}/executed \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"tx_hash": "0x9a3f5c…"
}
'import requests
url = "https://api.range.org/v2/screening/checks/{check_id}/executed"
payload = { "tx_hash": "0x9a3f5c…" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({tx_hash: '0x9a3f5c…'})
};
fetch('https://api.range.org/v2/screening/checks/{check_id}/executed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.range.org/v2/screening/checks/{check_id}/executed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tx_hash' => '0x9a3f5c…'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v2/screening/checks/{check_id}/executed"
payload := strings.NewReader("{\n \"tx_hash\": \"0x9a3f5c…\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.range.org/v2/screening/checks/{check_id}/executed")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tx_hash\": \"0x9a3f5c…\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/screening/checks/{check_id}/executed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tx_hash\": \"0x9a3f5c…\"\n}"
response = http.request(request)
puts response.read_body{
"check_id": "6f1c2a9e-3b7d-4c55-9a0e-2d8f1e4b7c31",
"direction": "outbound",
"client_entity_id": "6859927c-292e-4077-8d6a-70542c00a267",
"client_name": "Northwind Custody",
"counterparty_address": "0x62348b9125085ee5286aa68a7a17d15f090192bd",
"counterparty_name": null,
"network": "eth",
"amount": "48000.00",
"asset": "USDC",
"transfer_ref": "pay_8812",
"transaction_id": null,
"tx_hash": null,
"is_approved_counterparty": false,
"flagged": true,
"reasons": [
{
"code": "not_approved_counterparty",
"check_type": "approved_counterparties",
"policy_key": "client.whitelist",
"message": "Not one of the client's approved counterparties"
}
],
"checks": [
{
"kind": "address_risk",
"check_type": "range_address_risk",
"label": "Range address risk",
"provider": "range",
"provider_used": null,
"status": "pass",
"screened_at": "2026-10-07T09:12:03.120Z",
"note": null,
"reason": {
"code": "not_approved_counterparty",
"check_type": "approved_counterparties",
"policy_key": "client.whitelist",
"message": "Not one of the client's approved counterparties"
},
"risk_tier": "low",
"travel_rule_status": "complete",
"provider_detail": {
"provider_status": "SETTLED"
},
"evidence": {
"screen_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"score": 100,
"sanctioned": true,
"signals": [
{
"signal": "eu-sanctioned",
"name": "EU Sanctioned",
"pillar": "exposure",
"severity": "severe",
"summary": "1.24% of counterparty volume is eu-sanctioned, crossing the 1% (severe) threshold.",
"confidence": null,
"rule": {
"name": "Sanctions exposure",
"threshold": "1% (severe)"
}
}
],
"listings": [
{
"authority": "OFAC",
"program": "SDN",
"list_key": "us_ofac_sdn",
"listed_at": "2022-04-14",
"delisted_at": null
}
],
"attribution": [
{
"name": "Lazarus Group",
"category": "sanctions",
"role": "owner",
"polarity": "risk",
"confidence": 98
}
],
"exposures": [
{
"name": "Tornado Cash",
"category": "mixer",
"direction": "incoming",
"hop": "direct",
"share": 0.123,
"share_basis": "total-volume",
"usd": 45210
}
],
"totals": {
"incoming_usd": 367000,
"outgoing_usd": 120000,
"flagged_incoming_usd": 45210,
"flagged_outgoing_usd": 0
},
"data_as_of": "2026-10-08T09:00:00Z",
"provider_used": "chainalysis"
}
}
],
"case_id": "0d9c7a1e-5b3f-4a2e-8c6d-1f2e3a4b5c6d",
"travel_rule_followup": {
"status": "awaiting",
"executed_at": null,
"tx_hash": null,
"due_at": null,
"resolved_at": null,
"provider": "notabene",
"case_id": null,
"travel_rule_status": "complete"
},
"created_at": "2026-10-07T09:12:03.120Z",
"verdict": "blocked",
"status": "pending",
"executed_at": null,
"cancelled_at": null,
"execution_case_id": null
}Authorizations
Authorization method required to allow user to access the api endpoints.
Path Parameters
Body
The broadcast transaction hash. Resending the same hash is safe.
128"0x9a3f5c…"
Response
"6f1c2a9e-3b7d-4c55-9a0e-2d8f1e4b7c31"
inbound, outbound "outbound"
"6859927c-292e-4077-8d6a-70542c00a267"
"Northwind Custody"
"0x62348b9125085ee5286aa68a7a17d15f090192bd"
null
"eth"
"48000.00"
"USDC"
"pay_8812"
null
null
false
true
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The case the flag opened, null when it did not flag. A /v2/cases id: read and work it with GET /v2/cases/{id} (source_type transaction_screening).
"0d9c7a1e-5b3f-4a2e-8c6d-1f2e3a4b5c6d"
Show child attributes
Show child attributes
"2026-10-07T09:12:03.120Z"
Outbound only, always present there. Send only on "allowed".
allowed, blocked "blocked"
Inbound only: pending while a check is awaited, then clear or flagged. Release a quarantined deposit on clear.
pending, clear, flagged null
null
The /v2/cases id of the case a blocked transfer sent anyway opened.
null
Was this page helpful?